home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / BARNET / ARMLINUX / MAIL / 9804 / 000032_owner-linux-arm…r.rutgers.edu _Mon Apr 13 20:13:51 1998.msg < prev    next >
Internet Message Format  |  1998-05-13  |  4KB

  1. Return-Path: <owner-linux-arm-outgoing@vger.rutgers.edu>
  2. Received: from orava.funet.fi (orava.funet.fi [128.214.248.46])
  3.     by odie.barnet.ac.uk (8.8.6/8.8.6) with ESMTP id UAA29788
  4.     for <willy@odie.fluff.org>; Mon, 13 Apr 1998 20:13:49 +0100
  5. Received: from vger.rutgers.edu ([128.6.190.2]:14724 "EHLO vger.rutgers.edu" ident: "root") by orava.funet.fi with ESMTP id <393068-13337>; Mon, 13 Apr 1998 22:11:36 +0300
  6. Received: by vger.rutgers.edu id <970909-214>; Mon, 13 Apr 1998 14:33:15 -0400
  7. Received: from runyon.cygnus.com ([205.180.230.5]:32947 "EHLO cygnus.com" ident: "SOCKWRITE-65") by vger.rutgers.edu with ESMTP id <971103-214>; Mon, 13 Apr 1998 14:29:49 -0400
  8. Received: from elmo.cygnus.com (elmo.cygnus.com [205.180.230.137])
  9.     by runyon.cygnus.com (8.8.7-cygnus/8.8.7) with ESMTP id LAA03750;
  10.     Mon, 13 Apr 1998 11:31:00 -0700 (PDT)
  11. Received: (nickc@localhost) by elmo.cygnus.com (8.8.5/8.6.4) id LAA30433; Mon, 13 Apr 1998 11:30:29 -0700
  12. Date:     Mon, 13 Apr 1998 11:30:29 -0700
  13. Message-Id: <199804131830.LAA30433@elmo.cygnus.com>
  14. From: Nick Clifton <nickc@cygnus.com>
  15. To: gilbertd@treblig.org
  16. CC: linux-arm@vger.rutgers.edu, egcs-bugs@cygnus.com, rearnsha@arm.com
  17. In-reply-to: <Pine.LNX.3.96.980411012814.501D-100000@tardis.home.dave>
  18.     (message from Dave Gilbert on Sat, 11 Apr 1998 01:36:41 +0100 (BST))
  19. Subject: Re: egcs-980406 (and earlier)/ARM ldrsb - incorrect offset range
  20. X-Orcpt: rfc822;linux-arm@vger.rutgers.edu
  21. Sender: owner-linux-arm@vger.rutgers.edu
  22. Precedence: bulk
  23. X-Loop: majordomo@vger.rutgers.edu
  24. Status: RO
  25.  
  26. : Date: Sat, 11 Apr 1998 01:36:41 +0100 (BST)
  27. : From: Dave Gilbert <gilbertd@treblig.org>
  28. : Hi,
  29. :   In egcs-980406 (and earlier versions) the address offset range of the
  30. : ldrsb instruction (introduced in ARM architecture v4) is set to be the
  31. : same as normal ARM ldr (load register) instructions when it is actually
  32. : a lot smaller.  The following example excersises this:
  33. : ------------------------------------------------------------------------
  34. : struct foo {
  35. :   int padding[200];
  36. :   signed char toget;
  37. : };
  38. : signed char bar(struct foo* p) {
  39. :   return p->toget;
  40. : };
  41. : -------------------------------------------------------------------------
  42. : gcc -mcpu=strongarm110  egbug.c -O2
  43. : /tmp/cca06251.s: Assembler messages:
  44. : /tmp/cca06251.s:19: Error: address offset too large
  45. : _bar:
  46. :         @ args = 0, pretend = 0, frame = 0
  47. :         @ frame_needed = 1, current_function_anonymous_args = 0
  48. :         mov     ip, sp
  49. :         stmfd   sp!, {fp, ip, lr, pc}
  50. :         sub     fp, ip, #4
  51. :         ldrsb   r0, [r0, #800]     ******** Range should be +/- 255
  52. :         ldmea   fp, {fp, sp, pc}^
  53.  
  54. Applying this patch fixes the problem:
  55.  
  56. Index: arm.h
  57. ===================================================================
  58. RCS file: /egcs/carton/cvsfiles/egcs/gcc/config/arm/arm.h,v
  59. retrieving revision 1.5
  60. diff -p -r1.5 arm.h
  61. *** arm.h    1998/04/08 06:19:00    1.5
  62. --- arm.h    1998/04/13 18:30:02
  63. *************** do                                    \
  64. *** 1408,1414 ****
  65.             && INTVAL (op) <= 31)                    \
  66.           goto LABEL;                            \
  67.           }                                \
  68. !       range = (MODE) == HImode ? (arm_arch4 ? 256 : 4095) : 4096;    \
  69.         if (code == CONST_INT && INTVAL (INDEX) < range            \
  70.         && INTVAL (INDEX) > -range)                            \
  71.           goto LABEL;                            \
  72. --- 1408,1416 ----
  73.             && INTVAL (op) <= 31)                    \
  74.           goto LABEL;                            \
  75.           }                                \
  76. !       /* NASTY: Since this limits the addressing of unsigned byte loads */      \
  77. !       range = ((MODE) == HImode || (MODE) == QImode)                    \
  78. !               ? (arm_arch4 ? 256 : 4095) : 4096;                        \
  79.         if (code == CONST_INT && INTVAL (INDEX) < range            \
  80.         && INTVAL (INDEX) > -range)                            \
  81.           goto LABEL;                            \
  82.  
  83. The code now produced looks like this:
  84.  
  85.   _bar:
  86.         mov     ip, sp
  87.         stmfd   sp!, {fp, ip, lr, pc}
  88.         mov     r3, #800
  89.         sub     fp, ip, #4
  90.         ldrsb   r0, [r0, r3]
  91.         ldmea   fp, {fp, sp, pc}
  92.  
  93. Nick
  94. unsubscribe: body of `unsubscribe linux-arm' to majordomo@vger.rutgers.edu